﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ApplicationModel;
using System.Runtime.Serialization;

namespace Anagramme.Contracts
{
    /// <summary>
    /// Définition d'un joueur
    /// </summary>
    [DataContract]
    public class Player : ObservableObject
    {
        #region Constructors
        /// <summary>
        /// Crée une nouvelle instance de la classe <see cref="Player"/>
        /// </summary>
        public Player()
        {
            this._token = Guid.Empty;
        }

        /// <summary>
        /// Crée une nouvelle instance de la classe <see cref="Player"/>
        /// </summary>
        /// <param name="token">Jeton de sécurité du client associé</param>
        public Player(Guid token)
        {
            this._token = token;
        }
        #endregion

        #region Fields
        private int _id;
        private bool _isLobbyMaster;
        private bool _isReadyToPlay;
        private string _name;
        private Team _team;
        private Guid _token;
        #endregion

        #region Properties
        /// <summary>
        /// Obtient ou défini l'identifiant du joueur
        /// </summary>
        [DataMember]
        public int Id
        {
            get
            {
                return this._id;
            }
            set
            {
                if (this._id != value)
                {
                    base.RaisePropertyChanging();
                    this._id = value;
                    base.RaisePropertyChanged();
                }
            }
        }

        /// <summary>
        /// Obient ou défini une valeur indiquant si le joueur est le maitre de la salle d'attente
        /// </summary>
        [DataMember]
        public bool IsLobbyMaster
        {
            get
            {
                return this._isLobbyMaster;
            }
            set
            {
                if (this._isLobbyMaster != value)
                {
                    base.RaisePropertyChanging();
                    this._isLobbyMaster = value;
                    base.RaisePropertyChanged();
                }
            }
        }

        /// <summary>
        /// Obient ou défini une valeur indiquant si le joueur est prêt à démarrer la partie
        /// </summary>
        [DataMember]
        public bool IsReadyToPlay
        {
            get
            {
                return this._isReadyToPlay;
            }
            set
            {
                if (this._isReadyToPlay != value)
                {
                    base.RaisePropertyChanging();
                    this._isReadyToPlay = value;
                    base.RaisePropertyChanged();
                }
            }
        }
        
        /// <summary>
        /// Obtient ou défini le nom du joueur
        /// </summary>
        [DataMember]
        public string Name
        {
            get
            {
                return this._name;
            }
            set
            {
                if (this._name != value)
                {
                    base.RaisePropertyChanging();
                    this._name = value;
                    base.RaisePropertyChanged();
                }
            }
        }
        
        /// <summary>
        /// Obtient ou défini l'équipe du joueur
        /// </summary>
        [DataMember]
        public Team Team
        {
            get
            {
                return _team;
            }
            set
            {
                if (this._team != value)
                {
                    base.RaisePropertyChanging();
                    this._team = value;
                    base.RaisePropertyChanged();
                }
            }
        }

        /// <summary>
        /// Obtient le heton de sécurité du joueur
        /// </summary>
        public Guid Token
        {
            get { return this._token; }
        }
        #endregion
    }
}
